package top.yxqz.number4.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.api.ApiController;
import com.baomidou.mybatisplus.extension.api.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import top.yxqz.number4.entity.TSsmEmp;
import top.yxqz.number4.service.TSsmEmpService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;

/**
 * (TSsmEmp)表控制层
 * RestController 返回的数据
 * RequestMapping 路由 里面的value就是我们要请求的路径值
 * /tSsmEmp 此处的反斜杠是为了区分不同的接口定义的 （rest）风格 ant风格
 * /user/login/
 * 相同路由 有不同结果 ：相同的请求url但是请求的方式（get|post|put|Delete）不同结果不同
 */
@RestController
@RequestMapping("emp")
public class TSsmEmpController extends ApiController {
    /**
     * 服务对象
     *
     * @Value 获取配置文件信息
     * @Autowired 做DI 默认ByType
     * @Resource 做DI  默认ByName
     */
    @Resource
    private TSsmEmpService tSsmEmpService;


    /**
     * 分页数据
     * 分页对象的创建Page对象----mybatis
     * 当前页 current
     * 每页显示的数据条数 size
     * uri:/emp/page/current/size:/emp/page/1/10
     * 条件查询
     * 前端传入条件对象：前端封装--后端可以直接解析
     */
    @GetMapping("page/{current}/{size}")
    public R empPage(@PathVariable("current") Integer current, @PathVariable("size") Integer size, TSsmEmp tSsmEmp) {
//        分页
        IPage<TSsmEmp> page = new Page<>(current, size);
//        普通的分页查询
//        IPage<TSsmEmp> empsPage = tSsmEmpService.page(page);
//        封装条件对象
        LambdaQueryWrapper<TSsmEmp> wrapper = new LambdaQueryWrapper<>();
//        第一个参数：条件非空判断，用了Strings工具类 ，第二个参数使用Lambda写法来获取数据库中的列名，第三个参数是获取要模糊匹配的属性名
        wrapper.like(Strings.isNotEmpty(tSsmEmp.getEmpName()), TSsmEmp::getEmpName, tSsmEmp.getEmpName());//姓名条件判断
        wrapper.like(Strings.isNotEmpty(tSsmEmp.getEmail()), TSsmEmp::getEmail, tSsmEmp.getEmail());//邮箱条件判断
        wrapper.eq(Strings.isNotEmpty(String.valueOf(tSsmEmp.getAge())), TSsmEmp::getAge, tSsmEmp.getAge());//邮箱条件判断
//        条件分页查询
        IPage<TSsmEmp> empIPage = tSsmEmpService.page(page, wrapper);
//        System.out.println("条件对象啊："+tSsmEmp);
        return R.ok(empIPage);
    }

    /**
     * 不分页查询所有的数据
     * 不需要条件
     * 不需要分页
     * <p>
     * 查询所有数据
     * 用集合返回数据
     * 在MP中已经写好了相关的接口 list
     */
    @GetMapping
    public R getAllEmpsList() {
        List<TSsmEmp> list = tSsmEmpService.list();
//        校验数据结果
        if (list.size() == 0) {
            return R.failed("你好 没有找数据");
        }
        return R.ok(list);
    }


    /**
     * 分页查询所有数据
     *
     * @param page    分页对象
     * @param tSsmEmp 查询实体（条件）  和数据库表格对应
     * @return 所有数据 R
     * R:目前是来自于MP 但是只有在MP3.4以上的版本才有
     * R<T> ：<>是泛型，任意类型 你传入啥类型 我就用啥类型，一般都是工具类（不用我们自己写）
     * controller----service（imp)---Mapper（dao）
     */

    public R selectAll(Page<TSsmEmp> page, TSsmEmp tSsmEmp) {

        return success(this.tSsmEmpService.page(page, new QueryWrapper<>(tSsmEmp)));
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public R selectOne(@PathVariable Serializable id) {
        return success(this.tSsmEmpService.getById(id));
    }

    /**
     * 新增数据
     *
     * @param tSsmEmp 实体对象
     * @return 新增结果
     */
    @PostMapping
    public R insert(@RequestBody TSsmEmp tSsmEmp) {
        return success(this.tSsmEmpService.save(tSsmEmp));
    }

    /**
     * 修改数据
     *
     * @param tSsmEmp 实体对象
     * @return 修改结果
     */
    @PutMapping
    public R update(@RequestBody TSsmEmp tSsmEmp) {
        return success(this.tSsmEmpService.updateById(tSsmEmp));
    }

    /**
     * 删除数据
     *
     * @param idList 主键结合
     * @return 删除结果
     */
    @DeleteMapping
    public R delete(@RequestParam("idList") List<Long> idList) {
        return success(this.tSsmEmpService.removeByIds(idList));
    }
}

